package com.young.design.pattern.proxy.cglib;

import net.sf.cglib.proxy.*;

import java.lang.reflect.Method;

/**
 * @ClassName : SimpleServiceMethodInterceptor
 * @Author : hyy
 * @Date: 2020-03-19
 */
public class SimpleServiceMethodInterceptor implements MethodInterceptor {
    private String name;

    private Enhancer enhancer = new Enhancer();

    public SimpleServiceMethodInterceptor(String name) {
        this.name = name;
    }

    public SimpleService getProxy(){
        enhancer.setSuperclass(SimpleService.class);
        //setCallbacks中定义了所使用的拦截器，其中NoOp.INSTANCE是CGlib所提供的实际是一个没有任何操作的拦截器，
        //他们是有序的,一定要和CallbackFilter里面的顺序一致。
        // 也就是说，callbackFilter 的accept 方法的返回值，决定了使用callbacks中的那一个callback
        // 如果accept 方法 的是 1 就表示使用NoOp.INSTANCE进行拦截。
        enhancer.setCallbacks(new Callback[]{this, NoOp.INSTANCE});
        enhancer.setCallbackFilter(new SimpleServiceFilter());
        return (SimpleService) enhancer.create();
    }



    /**
     *
     * @param o  代理对象
     * @param method 被代理方法
     * @param objects 方法执行参数
     * @param methodProxy  代理方法
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("目标方法执行之前");
        if(!"boss".equals(this.name)){
            System.out.println("非boss 用户不能调用方法");
            return null;
        }
        methodProxy.invokeSuper(o,objects);
        System.out.println("目标方法执行之后");
        return null;
    }
}
